#pragma onec

#include <iostream>
#include <pthread.h>
#include <ctime>
#include <string>

using namespace std;

typedef void (*callback_t)(); // 函数指针
static int num = 1;

class Thread
{ 
public:
    static void* Rontine(void* args)
    {
        Thread* thread = static_cast<Thread*>(args);
        thread->Entery();
        return nullptr;
    }
    Thread(callback_t cb)
        : _tid(0), _name(""), _start_timestamp(0), _isrunning(false), _cb(cb)
    {}
    void Run()
    {
        _name = "thread-" + to_string(num++);
        _start_timestamp = time(nullptr);
        _isrunning = true;
        pthread_create(&_tid, nullptr, Rontine, this);
    }
    void Join()
    {
        pthread_join(_tid, nullptr);
        _isrunning = false;
    }
    string Name()
    {
        return _name;
    }
    uint64_t StartTimestamp()
    {
        return _start_timestamp;
    }
    bool IsRunning()
    {
        return _isrunning;
    }
    void Entery()
    {
        _cb();
    }
    ~Thread()
    {}
private:
    pthread_t _tid;
    string _name;
    uint64_t _start_timestamp;
    bool _isrunning;
    callback_t _cb;
};
